<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Funktsioon, mis see on ning kuidas seda defineerida</title>
    </head>
    <body>
        <?php
            /*
             * Funktsioonid on ühed võimsamad programmivoo
             * kontrollstruktuurid üldse.
             * PHP dokumentatsiooni poolt esitatud pseudokood funktsiooni kirjeldamiseks:
             * 
             * <?php
             * function foo($arg_1, $arg_2, ... , $arg_n)
             * {
             *      echo "Example function.\n";
             *      return $retval;
             * }
             * ?>
             * 
             * ehk eesti keeles:
             * function funktsiooniNimi($argument_1, $argument_2, ..., $argument_n)
             * {
             *      funktsiooni sisu;
             *      Siin saab edukalt ka argumente kasutada. 
             * }
             *  
             * Funktsioon on koodiblokk, millel on nimi, omadus/omadused ning
             * teda saab php-s terve programmi skoobi ulatuses kasutada nii
             * palju, kui seda on vaja (kõik funktsioonid, mis php-s deklareeritud
             * on on globaalse skoobiga, ehk neid saab nimepidi välja kutsuda 
             * ükskõik, millises programmi osas (s.t. ka defineeritava funktsiooni
             * enda sees)). 
             * Funktsiooni blokk võib enda alla grupeerida nii erinevaid käsklusi,
             * teisi funktsioone, kui ka klasse. Kõik see grupp koos peaks olema võimeline
             * täitma talle omistatud ülesande/ülesanded (Ehk selle, mille pärast 
             * funktsioon üldse loodigi).
             * FUNKTSIOON KÄIVITUB AINULT SIIS, KUI PEALE DEFINEERIMIST, SEDA
             * KUSALGI PROGRAMMI SKOOBIS KA VÄLJA KUTSUTAKSE.
             * 
             * Täpsemat infot PHP funktsioonide kohta leiab tema dokumentatsioonist
             * aadressil: http://php.net/manual/en/functions.user-defined.php
             * 
             * Ühtlasi tuleb ära mainida, et funktsiooni defineerimisel kehtivad
             * funktsioonile nime panemisel samasugused reeglid nagu seda nõutakse
             * muutujanimede deklareerimise puhul. 
             * 
             * Et PHP pole tugevalt tüübitud programmeerimiskeel, ei toetata
             * PHP-s funktsioonide liiasust (overloadimist), nagu seda toetavad 
             * tugevalt tüübitud keeled nagu JAVA, C#, C++. 
             * Funktsioonide liiasus, ehk overloading tähendab seda, et on võimalik
             * kirjutada mitu sama nime alusel defineeritud funktsiooni. Ainsad erinevused,
             * mis funktsioonidel on, on see, et nad erinevad üksteisest 
             * funktsiooni sisendparameetrite arvu, või sisendparameetrite tüüpide
             * poolest. Kõige lõpuks aga funktsiooni väljundi, ehk tagastustüübi poolest
             * (Tagastatakse erinevaid andmetüüpe, s.t. integer, string, boolean vms).
             * Näide tugevalt tüübitud keele funktsioonist
             * 
             * public int teeYlesanne() {return 5;}
             * //overloaded funktsioon:
             * public double teeYlesanne(double mingiArv) {return 5.0 + mingiArv;} 
             * 
             * PHP puhul eelnevale sarnast toimingut teha ei saa. Kord juba 
             * mingi nimega defineeritud funktsioon ning sellele defineeritud sisu
             * jääb samaks terve programmi skoobis, ehk ulatuses. Lihtsalt parameetrite
             * arvu muutes ei saa kasutada uut funktsiooni, millel on sama nimi, mis
             * on juba mõne teise funktsiooni defineerimisel kasutuses olnud.
             * 
             * Loome funktsiooni, mis ütleb meile "Hello World!"
             */
        
             function ytleHelloWorld()
             {
                 echo 'Hello World!';
                 echo '<br/>';
             }
             //Et funktsioon peale defineerimist käima ka läheks, tuleb ta välja kutsuda
             ytleHelloWorld();
             
             /*
              * Kirjutame funktsiooni, mis nõuab endale sisendiks ka parameetrit.
              * Panna tähele, et funktsiooni ei tohi defineerida sama nimega.
              */
             $sisendparameetriTekst = 'Hello World! lause parameetrina';
             
             function ytleTekstMisParameetriMuutujasOn($sisendparameeter)
             {
                 echo $sisendparameeter;
                 echo '<br/>';
             }
             //Kutsume funktsiooni välja
             ytleTekstMisParameetriMuutujasOn($sisendparameetriTekst);
             //Funktiooni saab ka nii välja kutsuda:
             ytleTekstMisParameetriMuutujasOn("Tekst sisendparameetrina 2");
             
             //Nagu enne mainisime, et saa sama nimega funktsiooni enam teist 
             //korda deklareerida. Proovida saab järgnevat koodi, kui sellelt 
             //kommentaarid ümbert ära võtta. Tulemus peaks tagastama veateate
             
             /*
             function ytleHelloWorld()
             {
                 echo 'Mingi muu sisu';
             }
             */
             
             
             /*
              * Kasutame funktsiooni blokis ka tsükli abi. Teeme funktsiooni, mille
              * sisendparameeter peab olema positiivne täisarv (integer). Kui 
              * sisendparameetriks on näiteks täisarv 4, siis arvutab funktsioon summa 
              * 1+2+3+4. Üldvalem, millele funktsioon baseerub on seega 1+2+3+...+n = n(n+1)/2
              * 
              */
             
             function arvutaSisendiTaisarvulisteLiikmeteSumma($taisarv)
             {
                 //Esmalt tuleks kontrollida, kas sisendparameeter on ikka täisarv
                 if (!is_int($taisarv))
                 {
                     echo 'Sisend ei ole täisarv. Palun kontrollida funktsiooni parameetrit!';
                     //Siinkohal kasutame return lauset, mis sunnib interpretaatorit funktsiooni
                     //sisu edasisest täitmisest väljuma, sest sisendtingimused on valed
                     return;
                 }
                 else
                 {
                     //baseerume valemile n(n+1)/2
                     echo ($taisarv * ($taisarv + 1)) / 2;
                 }
             }
             
             //Kutsume funktsiooni välja
             arvutaSisendiTaisarvulisteLiikmeteSumma(4);
        ?>
    </body>
</html>
